#include "qwidget_playvideo.h"
#include <QPainter>
#include <QDebug>

QWidget_PlayVideo::QWidget_PlayVideo(QWidget *parent) : QWidget(parent)
{
    this->setMouseTracking(true); // 鼠标没有按下时也捕获鼠标移动事件

    // 设置播放源 为了方便FFmpegVideo对应窗口交互
    this->m_FFmpegVideo = new FFmpegVideo();;
    connect(m_FFmpegVideo, SIGNAL(sig_SendOneFrame(QImage)),      // 视频发送 绑定 播放界面的接收
            this, SLOT(slot_RecvOneFrame(QImage)),
            Qt::AutoConnection);

    m_PlayThread = new QThread(this);
    m_FFmpegVideo->moveToThread(m_PlayThread);  // 移动到线程中
    connect(m_PlayThread, SIGNAL(started()),    // 播放线程的开始信号 绑定 播放函数 实现异步
            m_FFmpegVideo, SLOT(play()),
            Qt::AutoConnection);

    // 布局
    m_Vlayout = new QVBoxLayout(); // 创建垂直布局管理器
    m_Hlayout = new QHBoxLayout(); // 创建水平布局管理器
    m_btn_startorstop = new QPushButton(this);
    m_Hlayout->addWidget(m_btn_startorstop, 0, Qt::AlignLeft);  // 按钮添加到水平布局，在最左边
    m_slider = new QSlider(Qt::Horizontal, this);
    m_Hlayout->addWidget(m_slider, 1);                          // 放到按钮右边，填充满
    QSpacerItem *space = new QSpacerItem(20, 200, QSizePolicy::Minimum, QSizePolicy::Expanding);
    m_Vlayout->addItem(space);                           // 填充上面的空间
    m_Vlayout->addLayout(m_Hlayout, Qt::AlignBottom);    // 水平布局 也就是按钮和进度条放到最下面

    this->setLayout(m_Vlayout);   // 设置布局

    // 绑定信号和槽
    connect(m_FFmpegVideo, &FFmpegVideo::sig_SendFrameNum_play, this, [&](int frame_id){  // 滑动条随视频播放滑动
        if(b_slidermoved == false){
            m_slider->setValue(frame_id);
        }
    });

    connect(m_slider, &QSlider::sliderReleased, this, [&]{     // 滑动条手动滑动，修改视频播放位置
        qDebug()<< "sliderReleased: " << m_slider->value();
        this->m_FFmpegVideo->JumptotheFrame(m_slider->value(), m_slider->value(), m_slider->value());
        this->m_FFmpegVideo->m_frame_id = m_slider->value();
        b_slidermoved = false;
    });

    connect(m_slider, &QSlider::sliderMoved, this, [&]{
        b_slidermoved = true;
    });

    connect(m_btn_startorstop, &QPushButton::clicked, this, [&]{    // 按钮点击，暂停 or 继续播放
        if(m_FFmpegVideo->m_stopPlay == false){
            qDebug()<<"视频暂停";
            m_FFmpegVideo->m_stopPlay = true;    // 停止运行，跳出循环
            // todo 修改按钮，播放
        }
        else{
            qDebug()<<"视频继续播放";
            m_FFmpegVideo->m_stopPlay = false;
            m_PlayThread->start();
            m_PlayThread->quit();   // 执行完后自动关闭，否则一直在运行中... 无法重新start发送开始信号
            // todo 修改按钮，暂停
        }
    });
}

QWidget_PlayVideo::~QWidget_PlayVideo()
{
    if(m_PlayThread->isRunning()){
        m_FFmpegVideo->m_stopPlay = true;
        m_PlayThread->quit();
        m_PlayThread->wait();
    }
    delete m_PlayThread;
    delete m_FFmpegVideo;
}

void QWidget_PlayVideo::slot_RecvOneFrame(QImage im){
    //qDebug()<<"slot_RecvOneFrame";
    this->image = im;
    this->update();  //刷新界面
}


void QWidget_PlayVideo::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    if(!this->image.isNull()){ //不为空则刷新
        painter.drawImage(QRect(0, 0, this->width(), this->height()), this->image);
    }
}

void QWidget_PlayVideo::mouseMoveEvent(QMouseEvent *event)
{
    // 布局在鼠标移动过程中会变化，使得布局内控件闪烁
//    if( m_Hlayout->geometry().contains(event->pos())){
//        for(int i = 0; i < m_Hlayout->count(); i++){
//            QLayoutItem *item = m_Hlayout->itemAt(i);
//            item->widget()->show();
//        }
//    }
//    else{
//        for(int i = 0; i < m_Hlayout->count(); i++){
//            QLayoutItem *item = m_Hlayout->itemAt(i);
//            item->widget()->hide();
//        }
//    }
    // 使用按钮和滑块的geometry进行判断：鼠标是否移动到窗口底部
    if( m_btn_startorstop->geometry().contains(event->pos()) ||
        m_slider->geometry().contains(event->pos())){
        for(int i = 0; i < m_Hlayout->count(); i++){
            QLayoutItem *item = m_Hlayout->itemAt(i);
            item->widget()->show();
        }
    }
    else{
        for(int i = 0; i < m_Hlayout->count(); i++){
            QLayoutItem *item = m_Hlayout->itemAt(i);
            item->widget()->hide();
        }
    }
}
